并行编程OpenMP基础及简单示例

您所在的位置:网站首页 parallel for指令 并行编程OpenMP基础及简单示例

并行编程OpenMP基础及简单示例

2024-07-10 18:52:40| 来源: 网络整理| 查看: 265

1. OpenMP基本概念

OpenMP是一种用于共享内存并行系统的多线程程序设计方案,支持的编程语言包括C、C++和Fortran。OpenMP提供了对并行算法的高层抽象描述,特别适合在多核CPU机器上的并行程序设计。编译器根据程序中添加的pragma指令,自动将程序并行处理,使用OpenMP降低了并行编程的难度和复杂度。当编译器不支持OpenMP时,程序会退化成普通(串行)程序。程序中已有的OpenMP指令不会影响程序的正常编译运行。

OpenMP通过编译指导命令来并行化,什么是编译指导命令?简单来说就是我们平常写的#开头的语句,通过程序中插入的这些编译指导命令,计算机就会完成并行计算的工作。在C/C++程序中,OpenMP的所有的编译指导命令都是以#pragma omp开始的,后面跟具体的功能指导命令,命令形式如下:

#pragma omp 指令 子句,子句,子句……

指令可以单独出现,子句必须出现在指令之后。现在如果看不懂也没关系,下面将开始用具体的例子来说明。

2. OpenMP执行模式

OpenMP采用fork-join的执行模式。开始的时候只存在一个主线程,当需要进行并行计算的时候,派生出若干个分支线程来执行并行任务。当并行代码执行完成之后,分支线程会合,并把控制流程交给单独的主线程。

一个典型的fork-join执行模型的示意图如下:

OpenMP编程模型以线程为基础,通过编译制导指令制导并行化,有三种编程要素可以实现并行化控制,他们分别是编译制导、API函数集和环境变量。

3. 编译制导

编译制导指令以#pragma omp 开始,后边跟具体的功能指令,格式如:#pragma omp 指令[子句[,子句] …]。常用的功能指令如下:

parallel:用在一个结构块之前,表示这段代码将被多个线程并行执行;for:用于for循环语句之前,表示将循环计算任务分配到多个线程中并行执行,以实现任务分担,必须由编程人员自己保证每次循环之间无数据相关性;parallel for:parallel和for指令的结合,也是用在for循环语句之前,表示for循环体的代码将被多个线程并行执行,它同时具有并行域的产生和任务分担两个功能;sections:用在可被并行执行的代码段之前,用于实现多个结构块语句的任务分担,可并行执行的代码段各自用section指令标出(注意区分sections和section); parallel sections:parallel和sections两个语句的结合,类似于parallel for;single:用在并行域内,表示一段只被单个线程执行的代码;critical:用在一段代码临界区之前,保证每次只有一个OpenMP线程进入;flush:保证各个OpenMP线程的数据影像的一致性;barrier:用于并行域内代码的线程同步,线程执行到barrier时要停下等待,直到所有线程都执行到barrier时才继续往下执行;atomic:用于指定一个数据操作需要原子性地完成;master:用于指定一段代码由主线程执行;threadprivate:用于指定一个或多个变量是线程专用,后面会解释线程专有和私有的区别。ordered, 用亍指定并行区域的循环按顺序执行 OpenMP除上述指令外,还有一些库函数,下面列出几个常用的库函数: - omp_get_num_procs, 返回运行本线程的多处理机的处理器个数。 - omp_get_num_threads, 返回当前并行区域中的活劢线程个数。 - omp_get_thread_num, 返回线程号 - omp_set_num_threads, 设置并行执行代码时的线程个数omp_init_lock, 刜始化一个简单锁omp_set_lock, 上锁操作omp_unset_lock, 解锁操作,要和omp_set_lock函数配对使用。omp_destroy_lock, omp_init_lock函数的配对操作函数,关闭一个锁

相应的OpenMP子句为:

private:指定一个或多个变量在每个线程中都有它自己的私有副本;firstprivate:指定一个或多个变量在每个线程都有它自己的私有副本,并且私有变量要在进入并行域或任务分担域时,继承主线程中的同名变量的值作为初值;lastprivate:是用来指定将线程中的一个或多个私有变量的值在并行处理结束后复制到主线程中的同名变量中,负责拷贝的线程是for或sections任务分担中的最后一个线程;reduction:用来指定一个或多个变量是私有的,并且在并行处理结束后这些变量要执行指定的归约运算,并将结果返回给主线程同名变量;nowait:指出并发线程可以忽略其他制导指令暗含的路障同步;num_threads:指定并行域内的线程的数目;schedule:指定for任务分担中的任务分配调度类型;shared:指定一个或多个变量为多个线程间的共享变量;ordered:用来指定for任务分担域内指定代码段需要按照串行循环次序执行;copyprivate:配合single指令,将指定线程的专有变量广播到并行域内其他线程的同名变量中;copyin:用来指定一个threadprivate类型的变量需要用主线程同名变量进行初始化;default:用来指定并行域内的变量的使用方式,缺省是shared。 4. API函数

除上述编译制导指令之外,OpenMP还提供了一组API函数用于控制并发线程的某些行为,下面是一些常用的OpenMP API函数以及说明:

5. 环境变量

OpenMP中定义一些环境变量,可以通过这些环境变量控制OpenMP程序的行为,常用的环境变量:

OMP_SCHEDULE:用于for循环并行化后的调度,它的值就是循环调度的类型; ** OMP_NUM_THREADS**:用于设置并行域中的线程数; ** OMP_DYNAMIC**:通过设定变量值,来确定是否允许动态设定并行域内的线程数; ** OMP_NESTED**:指出是否可以并行嵌套。 6. 简单的语句——开始并行!

前文讲到了openMP的语句方式,现在先来解锁一个最为简单也最为频繁的指令 parallel

#include #include using namespace std; int main() { #pragma omp parallel { cout cout cout #pragma omp for for(int i=0;i omp_set_num_threads(3); #pragma omp parallel sections { #pragma omp section { cout cout #pragma omp single { cout


【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭